package cn.yunhe.spring.session.controller;

import java.io.UnsupportedEncodingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
 *
 * @author wangfj
 *
 */
@Component
public class RedisUtils {
     private static String redisCode = "utf-8";
      
     @Autowired
     private RedisTemplate redisTemplate;
      
    /**
     * @param key
     */
    public long del(final String... keys) {
        return (Long) redisTemplate.execute(new RedisCallback() {
            public Long doInRedis(RedisConnection connection) throws DataAccessException {
                long result = 0;
                for (int i = 0; i < keys.length; i++) {
                    result = connection.del(keys[i].getBytes());
                }
                return result;
            }
        });
    }
 
        /**
         * @param key
         * @param value
         * @param liveTime
         */
        public void set(final byte[] key, final byte[] value, final long liveTime) {
            redisTemplate.execute(new RedisCallback() {
                public Long doInRedis(RedisConnection connection) throws DataAccessException {
                    connection.set(key, value);
                    if (liveTime > 0) {
                        connection.expire(key, liveTime);
                    }
                    return 1L;
                }
            });
        }
 
        /**
         * @param key
         * @param value
         * @param liveTime
         */
        public void set(String key, String value, long liveTime) {
            this.set(key.getBytes(), value.getBytes(), liveTime);
        }
 
        /**
         * @param key
         * @param value
         */
        public void set(String key, String value) {
            this.set(key, value, 0L);
        }
 
        /**
         * @param key
         * @param value
         */
        public void set(byte[] key, byte[] value) {
            this.set(key, value, 0L);
        }
 
        /**
         * @param key
         * @return
         */
        public String get(final String key) {
            return (String) redisTemplate.execute(new RedisCallback() {
                public String doInRedis(RedisConnection connection) throws DataAccessException {
                    try {
                        return new String(connection.get(key.getBytes()), redisCode);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    return "";
                }
            });
        }
 
        /**
         * @param key
         * @return
         */
        public boolean exists(final String key) {
            return (Boolean) redisTemplate.execute(new RedisCallback() {
                public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
                    return connection.exists(key.getBytes());
                }
            });
        }
 
        /**
         * @return
         */
        public String flushDB() {
            return (String) redisTemplate.execute(new RedisCallback() {
                public String doInRedis(RedisConnection connection) throws DataAccessException {
                    connection.flushDb();
                    return "ok";
                }
            });
        }
 
        /**
         * @return
         */
        public long dbSize() {
            return (Long) redisTemplate.execute(new RedisCallback() {
                public Long doInRedis(RedisConnection connection) throws DataAccessException {
                    return connection.dbSize();
                }
            });
        }
 
        /**
         * @return
         */
        public String ping() {
            return (String) redisTemplate.execute(new RedisCallback() {
                public String doInRedis(RedisConnection connection) throws DataAccessException {
                    return connection.ping();
                }
            });
        }
 
 
        
}
